/*
 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.imageio.plugins.gif;

import java.awt.image.ColorModel;
import java.awt.image.SampleModel;
import java.util.Locale;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriter;
import javax.imageio.spi.ImageWriterSpi;
import javax.imageio.stream.ImageOutputStream;
import com.sun.imageio.plugins.common.PaletteBuilder;

public class GIFImageWriterSpi extends ImageWriterSpi {

  private static final String vendorName = "Oracle Corporation";

  private static final String version = "1.0";

  private static final String[] names = {"gif", "GIF"};

  private static final String[] suffixes = {"gif"};

  private static final String[] MIMETypes = {"image/gif"};

  private static final String writerClassName =
      "com.sun.imageio.plugins.gif.GIFImageWriter";

  private static final String[] readerSpiNames = {
      "com.sun.imageio.plugins.gif.GIFImageReaderSpi"
  };

  public GIFImageWriterSpi() {
    super(vendorName,
        version,
        names,
        suffixes,
        MIMETypes,
        writerClassName,
        new Class[]{ImageOutputStream.class},
        readerSpiNames,
        true,
        GIFWritableStreamMetadata.NATIVE_FORMAT_NAME,
        "com.sun.imageio.plugins.gif.GIFStreamMetadataFormat",
        null, null,
        true,
        GIFWritableImageMetadata.NATIVE_FORMAT_NAME,
        "com.sun.imageio.plugins.gif.GIFImageMetadataFormat",
        null, null
    );
  }

  public boolean canEncodeImage(ImageTypeSpecifier type) {
    if (type == null) {
      throw new IllegalArgumentException("type == null!");
    }

    SampleModel sm = type.getSampleModel();
    ColorModel cm = type.getColorModel();

    boolean canEncode = sm.getNumBands() == 1 &&
        sm.getSampleSize(0) <= 8 &&
        sm.getWidth() <= 65535 &&
        sm.getHeight() <= 65535 &&
        (cm == null || cm.getComponentSize()[0] <= 8);

    if (canEncode) {
      return true;
    } else {
      return PaletteBuilder.canCreatePalette(type);
    }
  }

  public String getDescription(Locale locale) {
    return "Standard GIF image writer";
  }

  public ImageWriter createWriterInstance(Object extension) {
    return new GIFImageWriter(this);
  }
}
